/*
 * RLE.h
 *
 *  Created on: Jun 11, 2012
 *      Author: Nico
 */
 
 class RLE{
	
	protected:
		/* Atributos protegidos */
		
		// Tamanio del bloque en Bytes
		uInt blockSize;
		
		// Nombre del archivo de entrada
		char* inputFilename;
		
		
		// Nombre del archivo donde se guardara la salida
		char* outputFilename;
		
		
		// Indica si se esta leyendo desde archivo o analizando un 
		// bloque pasado por codigo.
		bool readingFromFile;
		
	public:

		
		/* Atributos publicos */
		
		// Si esta prendido, muestra debugs por pantalla
		bool debug; 
		
		
		/* Metodos publicos */
	
		void setInputFilename(const char*);
		void setOutputFilename(const char*);

 };
 
 class RLECompress : public RLE{
	
	
	protected:
		/* Atributos protegidos */
		
		ifstream inputFile;
		
		//ofstream outputFile;
		OCompressedStream* outputFile;
		
		// Indica la cantidad de bytes que se leyeron en la ultima
		// lectura. Sirve para saber cuantos bytes fueron leidos
		// en la lectura justo anterior al EOF. Cuando no hubo EOF, el
		// valor de lastReadSize sera igual a blockSize
		uInt lastReadSize;
		
		char last_1 = '1';
		char last_2 = '2';
		char last_3 = '3';
		
		
		/* Metodos protegidos */
		
		// Trae un bloque de texto del archivo de entrada
		int getNextBlockOfText(char**);
		
	private:
		bool imAtFirstBlock;
		
	
	public:
	
		// Dos constructores, por si se quiere usar con o sin archivos
		RLECompress();
		RLECompress(const char* inputFilename , const int blockSize);
		
		// Destructor
		~RLECompress();
		
		// Aplica el RLE a un bloque del archivo de entrada y
		// guarda el resultado en el archivo de output
		int runNextBlock( string* L, uInt* I );
		
		// Aplica el RLE a un texto pasado por parametro
		int runBlock(const char* texto , const uInt blockLength , string* compressed );
		
		// Comprime todo el archivo
		int run();
 };


class RLEDecompress : public RLE{
	
	protected:
		ICompressedStream* inputFile;
		
		ofstream outputFile;

		
	public:
	
		RLEDecompress(const char* inputFilename);
		
		// Destructor
		~RLEDecompress();
		
		
		// Descomprime un bloque del archivo de entrada y
		// guarda el resultado en el archivo de output
		int runNextBlock( string* texto );
		
		// Descomprime un bloque comprimido
		static int runBlock( const char* texto , const uInt blockLength , string* decompressed );
		
		// Descomprime todo el archivo.
		int run();
};
